import * as vscode from "vscode";
import {
  getBox3MapTempChatList,
  ExtendedQuickPickItem,
} from "@ap/user/map/getMapTempChatList";
import { CommandId } from "@ap/command";
import path from "path";
import { $context } from "@ap/extension";
/**
 * 表示 Visual Studio Code 中地图树视图的一个项目。
 * 继承 vscode.TreeItem 并添加特定于应用程序的属性，如 children。
 */
class MapTreeItem extends vscode.TreeItem {
  children?: MapTreeItem[];

  /**
   * 构造 MapTreeItem 的实例。
   * @param label 树项的标签。
   * @param description 树项的描述。
   * @param tooltip 悬停时显示的工具提示。
   * @param collapsibleState 树项的折叠状态。
   */
  constructor(
    public readonly label: string,
    public readonly collapsibleState: vscode.TreeItemCollapsibleState,
    public readonly iconPath: { light: vscode.Uri; dark: vscode.Uri },
    public readonly command?: vscode.Command,
  ) {
    super(label, collapsibleState);
  }
}

/**
 * 为 Visual Studio Code 中的地图树视图提供数据。
 * 实现 vscode.TreeDataProvider 接口以提供 getTreeItem、getChildren 和 refresh 功能。
 */
export default class TempChatPlayMapTreeDataProvider
  implements vscode.TreeDataProvider<MapTreeItem>
{
  // 用于信号树数据已更改的 EventEmitter。
  private _onDidChangeTreeData: vscode.EventEmitter<MapTreeItem | undefined> =
    new vscode.EventEmitter<MapTreeItem | undefined>();

  // 当树数据发生变化时触发的事件。
  readonly onDidChangeTreeData: vscode.Event<MapTreeItem | undefined> =
    this._onDidChangeTreeData.event;

  /**
   * 获取给定元素的树项。
   * @param element 要获取树项的元素。
   * @returns 给定元素的树项。
   */
  getTreeItem(element: MapTreeItem): vscode.TreeItem {
    return element;
  }

  /**
   * 异步获取给定元素的子项。
   * 如果未指定元素，则获取树的根元素。
   * @param element 要获取其子项的元素。
   * @returns 一个 Promise，解析为表示子项的 MapTreeItem 数组。
   */
  async getChildren(element?: MapTreeItem | undefined): Promise<MapTreeItem[]> {
    if (!element) {
      const data = await getBox3MapTempChatList();
      if (data) {
        // 如果没有提供元素，则从地图列表构建树结构。
        const mapData = this.buildTree(data);
        return mapData;
      }
      return [];
    }
    // 返回指定元素的子项（如果存在）。
    return element.children || [];
  }

  /**
   * 从扁平的地图数据列表构造树结构。
   * @param data 表示地图数据的扩展快速选择项列表。
   * @returns 表示构造的树的根节点的 MapTreeItem 数组。
   */
  private buildTree(data: ExtendedQuickPickItem[]): MapTreeItem[] {
    return data.map((item) => {
      const treeItem = new MapTreeItem(
        item.label,
        vscode.TreeItemCollapsibleState.None,
        {
          light: vscode.Uri.file(
            path.join($context.extensionPath, "image", "chatPlay-light.svg"),
          ),
          dark: vscode.Uri.file(
            path.join($context.extensionPath, "image", "chatPlay-dark.svg"),
          ),
        },
        {
          title: "临时频道处理",
          command: CommandId.map_selectBox3MapTempChatDetail,
          arguments: [item],
        },
      );
      return treeItem;
    });
  }

  /**
   * 刷新树数据，导致树视图重新获取数据。
   */
  refresh(): void {
    this._onDidChangeTreeData.fire(undefined);
  }
}
